람다식
✒️ 2025-05-15 13:42 내용 수정
함수형 프로그래밍을 표현하기 위한 것, 메서드를 하나의 식으로 표현한 것
- 함수(메서드)의 이름이 없는 익명 함수를 만들기 위한 표현 식
- 람다식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메서드를 쓸 수 있다.
- 람다식은 단 하나의 객체만 생성할 수 있으므로 내부 클래스(Inner classes)#4. 익명 클래스와 같다.
- 함수(메서드)만을 구현하고 실행할 수 있다.
- 메서드의 매개변수로 전달될 수도 있고, 메서드의 결과값으로 반환될 수도 있다.
- 람다식을 사용하면 문법이 매우 간결해지고, 원하는 결과를 쉽게 집계할 수 있다.
- 자바 스크립트는 함수형 프로그래밍이고, 함수를 정의해두면 객체를 생성하지 않고 바로 호출할 수 있다.
- Stream(스트림 API)도 함수형으로 작성하므로, 자바 스크립트 쓸 때 여러 상황에서 Stream을 쓰는 것을 생각해볼 것.
람다식과 외부 변수의 관계
- 람다식을 사용할 때 매개변수 값을 전달하는 것 외에 외부에서 정의된 지역변수를 사용하는 경우가 있다.
- 람다식 내부에서 지역변수를 사용하려면, 그 지역변수는 final(제어자#1. final 제어자)로 선언되어야 한다.
- 지역 변수는 Stack 영역에 생성되고, 람다식은 익명이기 때문에 Heap 영역에 생성되므로, 서로 생성되는 위치가 달라서 간섭할 수 없다.
- 람다식 내부에서 지역 변수를 사용할 경우 값을 복사해서 사용하므로, 값을 그대로 사용하는 것은 가능하지만 수정할 수 없다.
- 메모리 구조, 내부 클래스(Inner classes) 참고
람다식 표현
- 매개변수가 1개일 때
()생략 가능하다.
public void print(String str) {
System.out.println(str);
}
// 람다식
str -> {System.out.println(str);};
- 매개변수가 2개 이상일 때는
()를 반드시 넣어야 한다.
int add(int x, int y) {
return x + y;
}
// 람다식
(x, y) -> {return x + y;};
- 함수 구현 내용이 한 문장이거나 return이 없다면
{}생략 가능
public void print(int x, int y) {
System.out.println(x + y);
}
// 람다식
(x, y) -> System.out.println(x + y);
- void 타입 메서드가 아니더라도, return만 문장에 있는 경우, return과
{}생략 가능
int add(int x, int y) {
return x + y;
}
// 람다식
(x, y) -> {return x + y;};
(x, y) -> x + y;
람다식의 활용
- 이중 콜론 : 람다식을 보다 간결하게 사용할 수 있도록 해준다.
MyFunction mf = (int num) -> {System.out.println(num);};
MyFunction mf = num -> System.out.println(num);
MyFunction mf = System.out::println;
- 람다식을 함수의 매개변수로 사용할 수 있다.
- 함수형 인터페이스 내용과 함께 참고
@FunctionalInterface
public interface MyCalculator {
public int plus(int num1, int num2);
}
public class Calculator4 {
public static void main(String[] args) {
// 람다식을 매개변수로 사용
MyCalculator calc = (num1, num2) -> num1+num2;
System.out.println(myCalc(calc));
// 더 간략하게 만든다면 아래처럼 가능하다
System.out.println(myCalc((num1, num2) -> num1+num2));
}
static int myCalc(MyCalculator calc) {
return calc.plus(10, 7);
}
}
- 컬렉션과 함수형 인터페이스
- 함수형 인터페이스 내용과 함께 참고
- 컬렉션의 인터페이스에 다수의 디폴트 메서드가 추가되어 있고, 그 중 일부는 함수형 인터페이스를 사용한다.
import java.util.*;
public class Calculator5 {
public static void main(String[] args) {
List<String> list = Arrays.asList("이름1", "이름2", "이름3", "이름4", "이름5");
//for문을 사용한 출력
for(String s : list) {
System.out.print(s+" ");
}
System.out.println();
// 함수형 인터페이스 forEach를 사용
list.forEach(x -> System.out.print(x+" "));
System.out.println();
// 이중콜론을 사용한 간결화
// 다만 간격 조정이 안된다
list.forEachprint;
}
}
- 람다식을 반환값으로 사용하기
- 람다식을 함수의 매개변수로 사용한 것과 위치만 바뀐 형태 같아 보인다.
@FunctionalInterface
public interface MyCalculator {
public int plus(int num1, int num2);
}
public class Calculator6 {
public static void main(String[] args) {
// 람다식을 반환값으로 사용하기
MyCalculator calc = myCalc();
System.out.println(calc.plus(10, 7));
}
static MyCalculator myCalc() {
return (num1, num2) -> num1 + num2;
}
}